home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr48 / pas_0593.zip / STARWARP.PAS < prev    next >
Pascal/Delphi Source File  |  1993-05-30  |  4KB  |  124 lines

  1. {─ Fido Pascal Conference ────────────────────────────────────────────── PASCAL ─
  2. Msg  : 641 of 728                                                               
  3. From : Sean Palmer                         1:104/123.0          07 May 93  15:10 
  4. To   : Micah Lindsey                                                             
  5. Subj : StarWarp                                                               
  6. ────────────────────────────────────────────────────────────────────────────────
  7. ML> SP> Trick is to start them in the center, with a (slow) random speed for X
  8. ML> SP> and Y, and while they are still on the screen, multiply the speed by a
  9. ML> SP> fraction like 1.02 or something small like that so they speed up as
  10. ML> SP> they come "toward" you... (inc(speedX,speedX div 64) or something would
  11. ML> SP> work too, for fixed-point numbers.) If they go off the edge of the
  12. ML> SP> screen, put them back in the middle with a new  random speed.
  13. ML> SP> Also making them get bigger as they come would be nice.
  14. ML> SP> If you can't figure it out yourself I could whip something up for
  15. ML> SP> ya... _
  16.  
  17. ML>        I've just recently started working with graphics, and I'd like to
  18. ML>        take a look at that.  I'd particularly like to know how to animate
  19. ML>        something.
  20.  
  21. Ok, here's some source I just whipped up.}
  22.  
  23. {$A-,B-,D+,E-,F-,G+,I-,L+,N-,O-,R-,S-,V-,X+}
  24. {$M $2000,0,0}
  25. program starwarp;
  26. uses crt;
  27. const
  28.  xRes=320;
  29.  yRes=200;
  30. var color:byte;
  31. type
  32.  fixed=record case boolean of false:(l:longint);true:(f:word;i:integer);end;
  33.  star=record x,y:fixed;xs,ys:longint; timer:word; end;
  34. const numStars=128;
  35. var
  36.  a:array[0..numStars-1]of star;
  37.  curStar:^Star;
  38.  i:integer;
  39.  
  40. var inPort1:word;
  41. procedure waitRetrace;assembler;asm
  42.  mov dx,inPort1; {find crt status reg (input port #1)}
  43. @L1: in al,dx; test al,8; jnz @L1;  {wait for no v retrace}
  44. @L2: in al,dx; test al,8; jz @L2; {wait for v retrace}
  45.  end;
  46.  
  47. const
  48.  tableWriteIndex=$3C8;
  49.  tableDataRegister=$3C9;
  50.  
  51. procedure setColor(color,r,g,b:byte);assembler;asm {set DAC color}
  52.  mov dx,tableWriteIndex; mov al,color; out dx,al; inc dx;
  53.  mov al,r; out dx,al; mov al,g; out dx,al; mov al,b;out dx,al;
  54.  end; {write index now points to next color}
  55.  
  56. {plot a pixel in mode $13}
  57. procedure plot(x,y:word);Inline(
  58.   $5E/                   { pop si  ;y}
  59.   $5F/                   { pop di  ;x}
  60.   $B8/$00/$A0/           { mov ax,$A000}
  61.   $8E/$C0/               { mov es,ax}
  62.   $B8/$40/$01/           { mov ax,320}
  63.   $F7/$E6/               { mul si}
  64.   $01/$C7/               { add di,ax}
  65.   $8B/$06/>color/        { mov ax,[color]}
  66.   $AA);                  { stosb}
  67.  
  68.  
  69. procedure recenterStar;begin
  70.  with curStar^ do begin
  71.   timer:=0;
  72.   x.f:=0;x.i:=xRes div 2;
  73.   y.f:=0;y.i:=yRes div 2;
  74.   xs:=integer(random(65535)); if xs<0 then inc(xs);
  75.   ys:=integer(random(65535)); if ys<0 then inc(ys);
  76.   end;
  77.  end;
  78.  
  79. procedure eraseStar;begin
  80.  with curStar^ do begin
  81.   color:=0;
  82.   plot(x.i,y.i);
  83.   end;
  84.  end;
  85.  
  86. procedure moveStar;begin
  87.  with curStar^ do begin
  88.   inc(x.l,xs);
  89.   inc(y.l,ys);
  90.   inc(xs,xs div 8);
  91.   inc(ys,ys div 8);
  92.   if (timer>=64) or (word(x.i)>=xRes) or (word(y.i)>=yRes) then
  93.     recenterStar;
  94.   inc(timer)
  95.   end;
  96.  end;
  97.  
  98. procedure drawStar;begin
  99.  with curStar^ do begin
  100.   color:=succ(timer shr 3);
  101.   plot(x.i,y.i);
  102.   end;
  103.  end;
  104.  
  105. begin
  106.  inPort1:=memw[$40:$63]+6;
  107.  asm mov ax,$13; int $10; end;
  108.  for i:=0 to 8 do setcolor(i,i*6,i*5,i*7);
  109.  for i:=0 to numStars-1 do begin
  110.   curStar:=@a[i];
  111.   recenterStar;
  112.   end;
  113.  repeat
  114.   for i:=0 to numStars-1 do begin
  115.    curStar:=@a[i];
  116.    eraseStar;
  117.    moveStar;
  118.    drawStar;
  119.    end;
  120.   waitRetrace;
  121.   until keypressed;
  122.  readkey;
  123.  textmode(c80);
  124.  end.